package callback

import (
	"encoding/json"
	"errors"
	"strconv"
	"time"
)

type Msg struct {
	MsgType string    //消息类型
	MsgID   string    //消息id
	Date    time.Time //消息时间
	Data    string    //消息内容
	MsgErr  string    //错误信息
}

func (this *Msg) Err() error {
	if len(this.MsgErr) == 0 {
		return nil
	}
	return errors.New(this.MsgErr)
}

func (this *Msg) String() string {
	if len(this.MsgErr) == 0 {
		return this.Data
	}
	return this.MsgErr
}

func (this *Msg) Json() string {
	return string(this.Bytes())
}

func (this *Msg) Bytes() []byte {
	bytes, err := json.Marshal(this)
	this.SetErr(err)
	return bytes
}

func (this *Msg) SetErr(err error) *Msg {
	if len(this.MsgErr) == 0 && err != nil {
		this.Data = ""
		this.MsgErr = err.Error()
	}
	return this
}

func (this *Msg) SetMsg(data string) *Msg {
	this.Date = time.Now()
	this.Data = data
	return this
}

func (this *Msg) SetMsgType(msgType string) *Msg {
	this.MsgType = msgType
	return this
}

func NewMsg(msgType, data string) *Msg {
	return &Msg{
		MsgType: msgType,
		MsgID:   Md5(msgType + data + strconv.Itoa(int(time.Now().UnixNano()))),
		Date:    time.Now(),
		Data:    data,
	}
}
